package com.candy.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test02 {
    public static void main(String[] args) {
        test03();
    }

    public static void test03() {
        try {
            //获取类文件对象
            Class type1=Class.forName("com.candy.reflect.Student");
            //通过类文件对象创建构造函数对象
            Constructor cu=type1.getDeclaredConstructor(int.class,String.class,boolean.class);
            //通过构造函数对象实例化Student对象
            Student stu=(Student) cu.newInstance(25,"tom",true);
            //执行方法
           stu.sayBye("tom");
            stu.sayHi();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void test02() {
        Class type1=Student.class;
        try {
            //获取指定的方法对象，通过方法名和参数类型进行指定
            Method md=type1.getDeclaredMethod("sayHi");
            Method md2=type1.getDeclaredMethod("sayBye",String.class);
            //使用类文件对象创建实例
            Student stu=(Student) type1.newInstance();
            System.out.println("调用sayHi");
            //调用方法
            md.invoke(stu);
            System.out.println("调用sayBye");
            md2.invoke(stu,"张三");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void test01() {
        Class type1=Student.class;
        //获取类文件下的所有方法，不受访问控制修饰符的限制
        Method[] m=type1.getDeclaredMethods();
        for (Method mm:m) {
            System.out.println(mm.getName());
        }
    }
}
